package com.lijian.dubbo.service.impl;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.lijian.dubbo.listener.MyListener;
import com.lijian.dubbo.service.CallbackService;

public class CallbackServiceImpl implements CallbackService {

	private final Map<String, MyListener> listeners = new ConcurrentHashMap<String, MyListener>();

	public CallbackServiceImpl() {
		Thread t = new Thread(new Runnable() {
			public void run() {
				while (true) {
					try {
						for (Map.Entry<String, MyListener> entry : listeners
								.entrySet()) {
							try {
								entry.getValue().changed(
										getChanged(entry.getKey()));
								// 我也可以执行完就移除掉
								listeners.remove(entry.getKey());
							} catch (Throwable t) {
								listeners.remove(entry.getKey());
							}
						}
						Thread.sleep(5000); // 定时触发变更通知
					} catch (Throwable t) { // 防御容错
						t.printStackTrace();
					}
				}
			}
		});
		t.setDaemon(true);
		t.start();
	}

	public void addListener(String key, MyListener listener) {
		// 加入到执行队列中，行为就到此为止了
		listeners.put(key, listener);
//		listener.changed(getChanged(key)); // 发送变更通知
	}

	private String getChanged(String key) {
		return "Changed: "
				+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
						.format(new Date());
	}
}
